# encoding: utf-8
# @File  : conftest.py
# @Author: wu shaofan
# @Date  :  2024/04/17
# @Desc :
import datetime
import time
import pytest
import config


# @pytest.fixture
# def driver():
#     url = TPshop_URL
#     # 设置浏览器驱动路径
#     driver_path = BASE_DIR + r'/tools/126.0.6478.57/chromedriver.exe'
#     # 创建 ChromeOptions 对象
#     options = Options()
#     options.add_experimental_option("excludeSwitches", ["enable-logging"])
#     # 创建 Chrome WebDriver 服务
#     service = Service(driver_path)
#     # 创建 Chrome WebDriver 实例
#     driver = webdriver.Chrome(service=service, options=options)
#     # 窗口最大化
#     driver.maximize_window()
#     # 打开网页
#     driver.get(url)
#     # 返回 driver 对象
#     yield driver
#     # 关闭浏览器
#     driver.quit()

# TODO 用例执行报错，记录错误信息到日志（状态是call，过滤setup 和teardown过程中报错信息）

@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 定义日志文件路径
    path = config.BASE_DIR + r"/logs_error"
    out = yield  # 钩子函数的调用结果
    res = out.get_result()  # 获取用例执行结果

    # 检查测试用例是否在执行阶段失败
    if call.when == "call" and call.excinfo is not None:
        # 获取当前时间戳
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # 打开日志文件，以追加模式写入日志
        with open(path + r"/error_results.log", "a") as f:
            # 将时间戳、测试用例名称、行号、失败信息写入日志文件
            f.write(f"{timestamp} {item.nodeid}:[line:{item.location[1]}] 失败 : {res.longrepr}\n")

            # 写入一个空行，用于分隔不同的日志记录
            f.write("\n")

# pytest框架里面预定义的钩子函数，用于在测试结束后自动化收集测试结果


def pytest_terminal_summary(terminalreporter):
    # 获取测试用例总数
    total = terminalreporter._numcollected
    # 获取测试用例失败总数 如果没有失败用例，则返回空列表[]
    # 失败数 failed 表示测试用例执行过程中断言失败的数量
    failed = len(terminalreporter.stats.get('failed', []))
    # 获取测试用例通过总数
    passed = len(terminalreporter.stats.get('passed', []))
    # 获取deselected
    deselected = len(terminalreporter.stats.get('deselected', []))
    # error_num 表示测试过程中发生的无法处理的异常情况的数量
    error_num = len(terminalreporter.stats.get('error', []))
    # 测试执行时间，保留两位小数round('',2)
    duration = round(time.time() - terminalreporter._sessionstarttime, 2)
    # 时间显示时分秒样式 格式 00:00:03
    duration_pro = time.strftime("%H:%M:%S", time.gmtime(duration))

    # 统计通过率，失败率，错误率
    pass_rate = f"{(passed/total)*100:.0f}%" if total > 0 else 'N/A'
    fail_rate = f"{(failed/total)*100:.0f}%" if total > 0 else 'N/A'
    error_rate = f"{(error_num/total)*100:.0f}%" if total > 0 else 'N/A'
    # 字体改为绿色
    green = '\033[1;32m'
    summary = green + f'''
    TPshop自动化测试结果，通知如下，具体执行结果：
        测试用例总数：{total}
        测试用例通过数：{passed}  
        通过率：{pass_rate}
        测试用例失败数(断言失败)：{failed}  
        失败率：{fail_rate}
        错误数(程序出错)：{error_num}  
        错误率：{error_rate}
        跳过不执行数量：{deselected}
        执行总时长：{duration}s ({duration_pro})
    '''
    print(summary)
